package ar.edu.unicen.twitter.suggest.backend.recommendation.crawling;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import ar.edu.unicen.twitter.suggest.commons.dtos.Usuario;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author usuario
 */
public class Recolector implements RecolectorInterface {

    private List<ArrayList<Usuario>> arbol;
    private List<NivelRecoleccion> niveles;

    public Recolector(List<NivelRecoleccion> niveles2) {
        arbol = null;
        niveles = niveles2;
    }
    public int evaluados = 0;

    public List<NivelRecoleccion> getNiveles() {
        return niveles;
    }

    public List<Usuario> recolectar(Usuario usuarioInicial, boolean permitirRedundancia) {
        ArrayList<Usuario> usuariosIniciales = new ArrayList<Usuario>();
        usuariosIniciales.add(usuarioInicial);
        List<Usuario> resultado = this.recolectar(usuariosIniciales, permitirRedundancia);

        return resultado;
    }

    @Override
    public List<Usuario> recolectar(ArrayList<Usuario> usuariosPartida, boolean permitirRedundancia) {
        arbol = new ArrayList<ArrayList<Usuario>>();
        arbol.add(usuariosPartida);
        for (Usuario usuario : usuariosPartida) {
            usuario.setMentions(1);
            usuario.setScore(1);
        }
        //evita revisitar usuarios
        HashSet<Usuario> visitados = new HashSet<Usuario>();
        //int nivelN = 1;
        int i = 0;
        for (NivelRecoleccion nivel : niveles) {
            System.out.println("nivel iniciado");
            HashSet<Usuario> visitadosNivel;
            if (permitirRedundancia && i != 0 && i != (niveles.size() - 1)) {
                visitadosNivel = new HashSet<Usuario>();
                visitadosNivel.addAll(usuariosPartida);
            } else {
                visitadosNivel = visitados;
            }
            ArrayList<Usuario> siguientes = (ArrayList<Usuario>) nivel.recolectar(arbol.get(arbol.size() - 1), visitadosNivel);
            //si no es el ultimo nivel, elimina el crudo
            if(i < niveles.size()-1)
                nivel.getCrudo().clear();
            arbol.add(siguientes);
            evaluados += nivel.evaluados;
            System.out.println("nivel finalizado, evaluados : " + evaluados);
            i++;
        }
        List<Usuario> resultado = arbol.get(arbol.size() - 1);
        NivelRecoleccion nivel = niveles.get(0);
        if(niveles.get(niveles.size() - 1).getCrudo() != null){
            if (nivel.descartador != null) {
                for (Usuario usuario : usuariosPartida) {
                    Collection<Usuario> restantes = nivel.getSiguientes(usuario);
                    nivel.descartador.descartar(restantes);
                    if(restantes!=null)
                        niveles.get(niveles.size() - 1).getCrudo().removeAll(restantes);
                }
            }
        }
        System.out.println("resultado generado");

        return resultado;
    }

    public List<ArrayList<Usuario>> getArbol() {
        return arbol;
    }
}
